package br.uff.busuffweb.model;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author jthiago
 */
@NamedQueries({
    @NamedQuery(name = "Circuito.getTodos",
    query = "select c from Circuito c order by c.id"),
    
//    @NamedQuery(name = "Circuito.getPorNome",
//    query = "select c from Circuito c " +
//            " where c.nome = ?"),
//    
//    @NamedQuery(name = "Circuito.getPorNumero",
//    query = "select c from Circuito c " +
//            " where c.numero = ?"),
//    
//    @NamedQuery(name = "Circuito.getPorNumeroComListaDePontos",
//    query = "select c from Circuito c " +
//            " left outer join fetch c.pontos " +  
//            " where c.numero = ?"),
//    
//    @NamedQuery(name = "Circuito.getPorNumeroComListaDeParadas",
//    query = "select c from Circuito c " +
//            " left outer join fetch c.paradas " +  
//            " where c.numero = ?"),
//    
//    @NamedQuery(name = "Circuito.getPorNumeroComListaDeParadasEPontos",
//    query = "select c from Circuito c " +
//            " left outer join fetch c.paradas " +  
//            " left outer join fetch c.pontos " +  
//            " where c.numero = ?"),
//    
//    @NamedQuery(name = "Circuito.getPorNomeComListaDePontos",
//    query = "select c from Circuito c " +
//            " left outer join fetch c.pontos " +  
//            " where c.nome = ?"),
//        
//    @NamedQuery(name = "Circuito.getPorNomeComListaDeParadas",
//    query = "select c from Circuito c " +
//            " left outer join fetch c.paradas " +  
//            " where c.nome = ?"),
//    
//    @NamedQuery(name = "Circuito.getPorNomeComListaDeParadasEPontos",
//    query = "select c from Circuito c " +
//            " left outer join fetch c.paradas " +  
//            " left outer join fetch c.pontos " +  
//            " where c.nome = ?"),
//        
//    @NamedQuery(name = "Circuito.getPorNomeENumeroComListaDeParadasEPontos",
//    query = "select c from Circuito c " +
//            " left outer join fetch c.paradas " +  
//            " left outer join fetch c.pontos " +  
//            " where c.nome = ? and c.numero = ?")
})
@Entity
@SequenceGenerator(sequenceName = "seq_circuito", name = "Sequencia")
@Table(name = "circuito")
@XmlRootElement
public class Circuito implements Serializable {
    
    @Id
    @GeneratedValue(generator = "Sequencia", strategy = GenerationType.AUTO)
    private Long id;
    
    private String nome;
    
    private int numero;
    
    private String descricao;
    
    @OneToMany(fetch = FetchType.LAZY, mappedBy="circuito")
    private List<PontoCircuito> pontos;
    
    @OneToMany(fetch = FetchType.LAZY, mappedBy="circuito")
    private List<ParadaCircuito> paradas;
    
    @OneToMany(fetch = FetchType.LAZY, mappedBy="circuito")
    private List<OnibusCircuito> onibusCircuitos;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @XmlTransient
    public List<PontoCircuito> getPontos() {
        return pontos;
    }

    public void setPontos(List<PontoCircuito> pontos) {
        this.pontos = pontos;
    }

    @XmlTransient
    public List<ParadaCircuito> getParadas() {
        return paradas;
    }

    public void setParadas(List<ParadaCircuito> paradas) {
        this.paradas = paradas;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 83 * hash + Objects.hashCode(this.nome);
        hash = 83 * hash + this.numero;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Circuito other = (Circuito) obj;
        if (!Objects.equals(this.nome, other.nome)) {
            return false;
        }
        if (this.numero != other.numero) {
            return false;
        }
        return true;
    }

    @XmlTransient
    public List<OnibusCircuito> getOnibusCircuitos() {
        return onibusCircuitos;
    }

    public void setOnibusCircuitos(List<OnibusCircuito> onibusCircuitos) {
        this.onibusCircuitos = onibusCircuitos;
    }
}
